
package Online;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Alvaro Garcia Tapia
 * @author Pablo Mosquera Diaz
 * @author Victor Navarro Ortego
 * @author Adrian Neila Serrano
 * @author Daniel Sanchez Suarez
 * 
 * @proyecto Gestor de Tareas Online
 * @version 1.61
 */
public class Tareas {
        
     /*
     * Variables para la conexión a la BD
     */
        private String bd = "is2"; 
        private String user = "root";
        //Se añade un campo extra a la URI, para que admita transformaciones a null
        private String url ="jdbc:mysql://localhost/" + bd+"?zeroDateTimeBehavior=convertToNull";
        private Connection conexion;
        private java.sql.Statement statement;
        
        public Tareas(){
            try {
                //Se añade la biblioteca de mysql
                Class.forName("com.mysql.jdbc.Driver");
                //Se conecta a la BD
                conexion = DriverManager.getConnection(url, user,"");
                //Se genera la variable que interacciona con la BD
                statement = conexion.createStatement();
            } catch (SQLException ex) {
            } catch (ClassNotFoundException ex) {
            }
        }
        
        /**
         * Metodo que indica el estado de la conexion
         * @return true si se ha conectado, false en otro caso
         */
        public boolean estado(){
            return (!(statement == null));
        }
        
        /**
         * Metodo que devuelve las tareas asociadas a una lista
         * @param name
         * @param lista
         * @return String[]
         */
        public String[] gettareas(String name,String lista){
            //Variable que contiene los nombres de las tareas, tamaño maximo 1000 tareas
            String[] tareas = new String[1000];
            //Numero de tareas
            int numtareas = 0;
            try { 
               //Consulta SQL, buscando una tarea con ideLista igual al de la lista dada
                String consulta = "SELECT T1.Nombre nombre FROM tarea T1 Where T1.IdLista = \""+name+lista+"\";";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                //Comprobación si hay al menos un resultado
                while (result.next()){
                    tareas[numtareas] = result.getString(1);
                    numtareas++;
                }
            
            } catch (SQLException ex) {
                //Si no hay tareas se devuelve null
                tareas = null;
            }
            return tareas;
        }
        
        
        /**
         * Metodo que devuelve las tareas asociadas a favoritos
         * @param name
         * @param lista
         * @return String[][]
         */
        public String[][] getfavoritos(String name){
            //Variable que contiene los nombres de las tareas, tamaño maximo 1000 tareas
            String[][] tareas = new String[1000][2];
            //Numero de tareas
            int numtareas = 0;
            try { //Consulta SQL, buscando una tarea con ideLista igual al de la lista dada
                String consulta = "SELECT L1.Nombre nombre FROM lista L1 Where L1.NombreUsuario = \""+name+"\";";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                //Comprobación si hay al menos un resultado
                while (result.next()){
                    String lista = result.getString(1);
                    java.sql.Statement statementt = conexion.createStatement();
                    //Consulta SQL, buscando una tarea con ideLista igual al de la lista dada
                    String consultat = "SELECT T1.Nombre nombre FROM tarea T1 Where T1.Favorito = "+1+
                                        " && T1.IdLista = \""+name+lista+"\";";
                    //Resultado de la consulta
                    ResultSet resultt = statementt.executeQuery(consultat);
                    //Comprobación si hay al menos un resultado
                    while (resultt.next()){
                        tareas[numtareas][0] = resultt.getString(1);
                        tareas[numtareas][1] = lista;
                        numtareas++;
                    }
                }
            
            } catch (SQLException ex) {
                //Si no hay tareas se devuelve null
                Logger.getLogger(Tareas.class.getName()).log(Level.SEVERE, null, ex);
                tareas = null;
            }
            return tareas;
        }
        
        /**
         * Metodo que da los datos de una tarea
         * @param user
         * @param lista
         * @param name
         * @return String[]
         */
        public String[] gettarea(String user,String lista,String name){
            //Variable donde se almacenan los datos de la tarea
            String[] datos = new String[4];
            try { 
               //Consulta SQL, buscando una tarea que coincida el identificador de la tarea
                String consulta = "SELECT T1.Nombre nombre FROM tarea T1 Where T1.Identificador = \""+user+lista+name+"\";";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                //Comprobación si hay al menos un resultado
                if(result.next()){
                    String consultaf = "SELECT T1.FechaLimite fecha FROM tarea T1 Where T1.Identificador = \""+user+lista+name+"\";";
                    //Resultado de la consulta
                    ResultSet resultf = statement.executeQuery(consultaf);
                    
                    if(resultf.next()){
                        datos[0] = resultf.getString(1);
                        //Si la fecha es null, se actualiza con los valores indicados
                        if (datos[0]==null)
                            datos[0]="0000-00-00";
                        String consultat = "SELECT T1.TiempoEstimado tiempo FROM tarea T1 Where T1.Identificador = \""+user+lista+name+"\";";
                        ResultSet resultt = statement.executeQuery(consultat);
                        //Resultado de la consulta
                        if(resultt.next()){
                            datos [1] = resultt.getString(1);
                        }
                        String consultafa = "SELECT Favorito FROM tarea T1 Where T1.Identificador = \""+user+lista+name+"\";";
                        ResultSet resultfa = statement.executeQuery(consultafa);
                        //Resultado de la consulta
                        if(resultfa.next()){
                            datos [3] = resultfa.getString(1);
                        }
                        datos [2] = user+lista+name;
                    }
                }
                else 
                    datos = null;
            
            } catch (SQLException ex) {
                //Si la consulta falla se devuelve null                
                Logger.getLogger(Tareas.class.getName()).log(Level.SEVERE, null, ex);
                datos = null;
            }
            return datos;
        }
        
        /**
         * Metodo que añade una tarea nueva
         * @param id
         * @param name
         * @param dia
         * @param mes
         * @param año
         * @param tiempo
         * @return boolean
         */
        public boolean addtarea(String id,String name,String dia,String mes, String año,String tiempo){
            boolean terminado = true;
            try { 
               //Consulta SQL, insertado una nueva tarea
                String consulta = "INSERT INTO tarea(Identificador, Nombre, FechaLimite, TiempoEstimado, IdLista, Favorito)"+
                        "VALUES (\""+id+name+"\",\""+name+"\",\""+año+"/"+mes+"/"+dia+"\","+tiempo+",\""+id+"\","+0+");";
                //Resultado de la consulta
                int result = statement.executeUpdate(consulta);
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                terminado = false;
            }
            return terminado;
        }
        
        /**
         * Metodo que modifica una tarea existente
         * @param idanterior
         * @param id
         * @param name
         * @param dia
         * @param mes
         * @param año
         * @param tiempo
         * @return boolean
         */
        public boolean modificartarea(String idanterior,String id,String name,String dia,String mes, String año,String tiempo){
            boolean terminado = true;
            try { 
               //Consulta SQL, para actualizar la tabla de tareas
                String consulta = "UPDATE tarea SET Identificador =\""+id+"\",Nombre=\""+name+"\","
                                +"FechaLimite=\""+año+"/"+mes+"/"+dia+"\",TiempoEstimado="+tiempo+
                                " Where Identificador = \""+idanterior+"\";";
                //Resultado de la consulta
                int result = statement.executeUpdate(consulta);
            } catch (SQLException ex) {
                //Si la consulta falla
                terminado = false;
            }
            return terminado;
        }
        

        /**
         * Metodo que marca como favorita una tarea
         * @param id
         * @param favorito
         * @return boolean
         */
        public boolean favorito(String id,int favorito){
            boolean terminado = true;
            try { 
               //Consulta SQL, para actualizar la tabla de tareas
                String consulta = "UPDATE tarea SET Favorito = "+favorito+
                                " Where Identificador = \""+id+"\";";
                //Resultado de la consulta
                int result = statement.executeUpdate(consulta);
            } catch (SQLException ex) {
                //Si la consulta falla
                terminado = false;
            }
            return terminado;
        }
        
        /**
         * Metodo para eliminar una tarea
         * @param id 
         */
        public void eliminartarea(String id){
            try { 
               //Consulta SQL, para borrar una tarea
                String consulta = "DELETE FROM tarea"+
                                " Where Identificador = \""+id+"\";";
                //Resultado de la consulta
                int result = statement.executeUpdate(consulta);
            } catch (SQLException ex) {
            }
        }
        
        /**
         * Metodo que indica si existe o no una lista
         * @param user
         * @param nombre
         * @return boolean
         */
        public boolean existeLista(String user,String nombre){
            boolean existe = false;
            try { 
               //Consulta SQL, buscando un usuario que coincida user
                String consulta = "SELECT * FROM `lista` WHERE `Identificador` = \""+user+nombre+"\";";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                result.getRow();
                //Comprobación si hay al menos un resultado
                if (result.next()){
                    existe = true;
                }
            
            } catch (SQLException ex) {
                //Si no se encontraron resultados se devuelve null
                existe = false;
            }
            return existe;
        }
    
}
